home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Collection of Tools & Utilities
/
Collection of Tools and Utilities.iso
/
edit
/
elv18src.zip
/
main.c
< prev
next >
Wrap
C/C++ Source or Header
|
1994-01-16
|
12KB
|
595 lines
/* main.c */
/* Author:
* Steve Kirkendall
* 14407 SW Teal Blvd. #C
* Beaverton, OR 97005
* kirkenda@cs.pdx.edu
*/
/* This file contains the main() function of vi */
/* HACK! bcc needs to disable use of precompiled headers for this file,
or else command line args will not be passed to elvis */
#if __BORLANDC__
#include "borland.h"
#endif
#include "config.h"
#include <setjmp.h>
#include "vi.h"
extern SIGTYPE trapint(); /* defined below */
jmp_buf jmpenv;
#ifndef NO_DIGRAPH
static init_digraphs P_((void));
#endif
/*---------------------------------------------------------------------*/
#ifndef NO_GNU
/* This function writes a string out to stderr */
static void errout(str)
char *str; /* the string to be output */
{
write(2, str, strlen(str));
}
#endif
/*---------------------------------------------------------------------*/
#if AMIGA
# include "amiwild.c"
main (argc, argv)
#else
# if VMS
# include "vmswild.c"
main (argc, argv)
# else
# if TURBOC
int main(argc, argv)
# else
void main(argc, argv)
# endif
# endif
#endif
int argc;
char *argv[];
{
int i;
char *cmd = (char *)0;
char *err = (char *)0;
char *str;
char *tag = (char *)0;
#ifdef __EMX__
/* expand wildcards a la Unix */
_wildcard(&argc, &argv);
#endif
#ifndef NO_GNU
/* check for special GNU options. */
if (argc == 2 && (!strcmp(argv[1], "--help") || !strcmp(argv[1], "-?")))
{
errout("usage: ");
errout(argv[0]);
errout(" [options] [+excmd] [files]...\n");
errout("options: -R readonly -- discourage accidental overwrites\n");
errout(" -v start in \"vi\" screen editor mode\n");
errout(" -e start in \"ex\" line editor mode\n");
# ifndef NO_EXTENSIONS
errout(" -i start in vi's \"input\" mode\n");
# endif
errout(" -t tagname begin by looking up the tag \"tagname\"\n");
# ifndef NO_ERRLIST
errout(" -m errlist begin at first error listed in file \"errlist\"\n");
# endif
# ifndef CRUNCH
errout(" -c excmd begin by executing ex command \"excmd\"\n");
errout(" -w wsize set window size to \"wsize\" lines\n");
# endif
exit(0);
}
else if (argc == 2 && !strcmp(argv[1], "--version"))
{
errout(VERSION);
errout("\n");
exit(0);
}
#endif /* ndef NO_GNU*/
/* set mode to MODE_VI or MODE_EX depending on program name */
switch (argv[0][strlen(argv[0]) - 1])
{
case 'x': /* "ex" */
mode = MODE_EX;
break;
case 'w': /* "view" */
mode = MODE_VI;
*o_readonly = TRUE;
break;
#ifndef NO_EXTENSIONS
case 't': /* "edit" or "input" */
mode = MODE_VI;
*o_inputmode = TRUE;
break;
#endif
default: /* "vi" or "elvis" */
mode = MODE_VI;
}
#ifndef DEBUG
# ifdef SIGQUIT
/* normally, we ignore SIGQUIT. SIGINT is trapped later */
signal(SIGQUIT, SIG_IGN);
# endif
#endif
/* temporarily ignore SIGINT */
signal(SIGINT, SIG_IGN);
/* start curses */
initscr();
cbreak();
noecho();
scrollok(stdscr, TRUE);
/* arrange for deadly signals to be caught */
# ifdef SIGHUP
signal(SIGHUP, deathtrap);
# endif
# ifndef DEBUG
# ifdef SIGILL
signal(SIGILL, deathtrap);
# endif
# ifdef SIGBUS
signal(SIGBUS, deathtrap);
# endif
# ifdef SIGSEGV
signal(SIGSEGV, deathtrap);
# endif
# ifdef SIGSYS
signal(SIGSYS, deathtrap);
# endif
# endif /* !DEBUG */
# ifdef SIGPIPE
signal(SIGPIPE, deathtrap);
# endif
# ifdef SIGTERM
signal(SIGTERM, deathtrap);
# endif
# ifdef SIGUSR1
signal(SIGUSR1, deathtrap);
# endif
# ifdef SIGUSR2
signal(SIGUSR2, deathtrap);
# endif
/* initialize the options - must be done after initscr(), so that
* we can alter LINES and COLS if necessary.
*/
initopts();
/* map the arrow keys. The KU,KD,KL,and KR variables correspond to
* the :ku=: (etc.) termcap capabilities. The variables are defined
* as part of the curses package.
*/
if (has_KU) mapkey(has_KU, "k", WHEN_VICMD|WHEN_INMV, "<Up>");
if (has_KD) mapkey(has_KD, "j", WHEN_VICMD|WHEN_INMV, "<Down>");
if (has_KL) mapkey(has_KL, "h", WHEN_VICMD|WHEN_INMV, "<Left>");
if (has_KR) mapkey(has_KR, "l", WHEN_VICMD|WHEN_INMV, "<Right>");
if (has_HM) mapkey(has_HM, "^", WHEN_VICMD|WHEN_INMV, "<Home>");
if (has_EN) mapkey(has_EN, "$", WHEN_VICMD|WHEN_INMV, "<End>");
if (has_PU) mapkey(has_PU, "\002", WHEN_VICMD|WHEN_INMV, "<PageUp>");
if (has_PD) mapkey(has_PD, "\006", WHEN_VICMD|WHEN_INMV, "<PageDn>");
if (has_KI) mapkey(has_KI, "i", WHEN_VICMD|WHEN_INMV, "<Insert>");
#if MSDOS || OS2
# ifdef RAINBOW
if (!strcmp("rainbow", o_term))
{
mapkey("\033[1~", "/", WHEN_VICMD, "<Find>");
mapkey("\033[3~", "x", WHEN_VICMD|WHEN_INMV, "<Remove>");
mapkey("\033[4~", "v", WHEN_VICMD|WHEN_INMV, "<Select>");
mapkey("\033[17~", ":sh\n", WHEN_VICMD, "<Intrpt>");
mapkey("\033[19~", ":q\n", WHEN_VICMD, "<Cancel>");
mapkey("\033[21~", "ZZ", WHEN_VICMD, "<Exit>");
mapkey("\033[26~", "V", WHEN_VICMD|WHEN_INMV, "<AddlOp>");
mapkey("\033[28~", "\\", WHEN_VICMD|WHEN_INMV, "<Help>");
mapkey("\033[29~", "K", WHEN_VICMD|WHEN_INMV, "<Do>");
}
else
# endif /* RAINBOW */
{
mapkey("#s", "B", WHEN_VICMD|WHEN_INMV, "^<Left>");
mapkey("#t", "W", WHEN_VICMD|WHEN_INMV, "^<Right>");
}
#else /* not MSDOS */
# if AMIGA
mapkey("\233?~", "\\", WHEN_VICMD|WHEN_INMV, "<Help>");
# endif
if (has_kD && *has_kD != ERASEKEY)
{
mapkey(has_kD, "x", WHEN_VICMD|WHEN_INMV, "<Del>");
}
else if (ERASEKEY != '\177')
{
mapkey("\177", "x", WHEN_VICMD|WHEN_INMV, "<Del>");
}
#endif
#ifndef NO_DIGRAPH
init_digraphs();
#endif /* NO_DIGRAPH */
/* process any flags */
for (i = 1; i < argc && *argv[i] == '-'; i++)
{
switch (argv[i][1])
{
case 'R': /* readonly */
*o_readonly = TRUE;
break;
case 'L':
case 'r': /* recover */
msg("Use the `elvrec` program to recover lost files");
endmsgs();
refresh();
endwin();
exit(1);
break;
case 't': /* tag */
if (argv[i][2])
{
tag = argv[i] + 2;
}
else
{
tag = argv[++i];
}
break;
case 'v': /* vi mode */
mode = MODE_VI;
break;
case 'e': /* ex mode */
mode = MODE_EX;
break;
#ifndef NO_EXTENSIONS
case 'i': /* input mode */
*o_inputmode = TRUE;
break;
#endif
#ifndef NO_ERRLIST
case 'm': /* use "errlist" as the errlist */
if (argv[i][2])
{
err = argv[i] + 2;
}
else if (i + 1 < argc)
{
err = argv[++i];
}
else
{
err = "";
}
break;
#endif
#ifndef CRUNCH
case 'c': /* run the following command, later */
if (argv[i][2])
{
cmd = argv[i] + 2;
}
else
{
cmd = argv[++i];
}
break;
case 'w': /* set the window size */
if (argv[i][2])
{
*o_window = atoi(argv[i] + 2);
}
else
{
*o_window = atoi(argv[++i]);
}
break;
#endif
default:
msg("Ignoring unknown flag \"%s\"", argv[i]);
}
}
/* if we were given an initial ex command, save it... */
if (i < argc && *argv[i] == '+')
{
if (argv[i][1])
{
cmd = argv[i++] + 1;
}
else
{
cmd = "$"; /* "vi + file" means start at EOF */
i++;
}
}
/* the remaining args are file names. */
if (i < argc)
{
unsigned char *p = args - 1;
strcpy(args, argv[i]);
/* convert spaces in filenames to CRs so can use space as
* delimiter for multiple filenames */
while (*++p)
{
if (*p == ' ')
{
*p = SPACEHOLDER;
}
}
while (++i < argc && strlen(args) + 1 + strlen(argv[i]) < sizeof args)
{
*p = ' ';
strcpy(p+1, argv[i]);
while (*++p)
{
if (*p == ' ')
{
*p = SPACEHOLDER;
}
}
}
#ifndef __EMX__
# if MSDOS || TOS || OS2
/* expand wildcard characters, if necessary */
if (strchr(args, '*') || strchr(args, '?'))
{
strcpy(args, wildcard(args));
}
# endif
#endif
strcpy(tmpblk.c, args);
cmd_args(MARK_UNSET, MARK_UNSET, CMD_ARGS, TRUE, tmpblk.c);
}
else
{
/* empty args list */
args[0] = '\0';
nargs = 1;
argno = -1;
}
/* perform the .exrc files and EXINIT environment variable */
#ifdef SYSEXRC
doexrc(SYSEXRC);
#endif
#ifdef EXINIT
str = getenv(EXINIT);
if (str)
{
if (*str == '"')
str++;
if (str[strlen(str) - 1] == '"')
str[strlen(str) - 1]